package com.starsky.common.utils;

import org.apache.commons.lang3.StringUtils;

import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * java 原生swing操作界面
 */
public class SwingAwtUtils {

    //支持上传文件类型
    private static String[] fileTypes = {"xls", "xlsx", "doc", "docx", "txt", "sql", "md", "png", "pgep"};

    private SwingAwtUtils() {
    }

    /**
     * 创建frame框子
     *
     * @param panel：面板，这个类似于 HTML 的 div 标签,可以创建多个面板并在 JFrame 中指定位置,
     *                       面板中可以添加文本字段，按钮及其他组件。
     */
    public static JFrame createJFrame(String title, int widht, int height, JPanel panel) {
        // 创建 JFrame 实例
        JFrame frame = new JFrame(title);
        // 设置窗口大小
        frame.setSize(widht, height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //创建面板，这个类似于 HTML 的 div 标签,可以创建多个面板并在 JFrame 中指定位置, 面板中可以添加文本字段，按钮及其他组件。
        frame.add(panel); // 添加面板
        // 设置界面可见
        frame.setVisible(true);
        return frame;
    }

    /**
     * 1.创建 JLabel
     * 创建input 输入框头部 中文名称
     *
     * @return
     */
    public static JLabel createLabel(String title, int x, int y, int width, int height) {
        JLabel fromLabel = new JLabel(title);
        fromLabel.setBounds(x, y, width, height);
        return fromLabel;
    }

    /**
     * 创建input文本域
     *
     * @return
     */
    public static JTextField createTextField(int columns, int x, int y, int width, int height) {
        //2.创建文本域
        JTextField fromText = new JTextField(columns);
        fromText.setBounds(x, y, width, height);
        return fromText;
    }

    /**
     * 创建输入 密码框
     *
     * @return
     */
    public static JPasswordField createPasswordField(int columns, int x, int y, int width, int height) {
        //这个类似用于输入的文本域,但是输入的信息会以点号代替，用于包含密码的安全性
        final JPasswordField passwordText = new JPasswordField(columns);
        passwordText.setBounds(x, y, width, height);
        return passwordText;
    }

    /**
     * 创建文本域
     */
    public static JTextArea createTextArea(String title, int x, int y, int width, int height) {
        final JTextArea textArea = new JTextArea("");
        textArea.setBounds(x, y, width, height);
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        return textArea;
    }

    /**
     * 3.创建选择按钮
     */
    public static JButton createButton(String menuName, int x, int y, int width, int height) {
        //3.创建选择按钮
        JButton fromButton = new JButton(menuName);
        fromButton.setBounds(x, y, width, height);
        return fromButton;
    }

    /**
     * 获取绝对路径
     *
     * @param chooser
     * @return
     */
    public static String getAbsolutePath(JFileChooser chooser) {
        String filepath = chooser.getSelectedFile().getAbsolutePath();//获取绝对路径
        System.out.println("文件绝对路径: " + filepath);
        return filepath;
    }

    /**
     * 获取文件后缀
     *
     * @param filepath: 文件全路径
     * @return
     */
    public static String getFileSubffix(String filepath) {
        final String subffix = filepath.substring(filepath.lastIndexOf(".") + 1);
        System.out.println("文件类型: " + subffix);
        return subffix;
    }


    /**
     * 获取文件名称
     *
     * @param filepath: 文件全路径
     * @return
     */
    public static String getFileName(String filepath) {
        final String fileName = filepath.substring(filepath.lastIndexOf("\\") + 1);
        System.out.println("文件名称: " + fileName);
        return fileName;
    }

    /**
     * 获取文件全路径
     *
     * @param dirPath:      目录
     * @param fileName：文件名称
     * @return
     */
    public static String getFilePath(String dirPath, String fileName) {
        final String name = fileName.substring(0, fileName.lastIndexOf("."));
        final String fileSubffix = getFileSubffix(fileName);
        String newFileName = name + "-" + getNowDateTime() + "." + fileSubffix;
        String targetPath = dirPath + "\\" + newFileName;
        System.out.println("获取文件全路径: " + targetPath);
        return targetPath;
    }

    /**
     * 获取当前格式化时间的方法
     */
    private static String getNowDateTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        return format.format(new Date());
    }


    /**
     * 告警提示信息：
     *
     * @param message 告警类型：0-error；1-info;2-warning;3-question;-1-plain
     */
    public static void showErrorDialog(String message) {
        JOptionPane.showMessageDialog(null, message, "错误提示", JOptionPane.ERROR_MESSAGE);
    }

    /**
     * 告警提示信息：
     *
     * @param message 告警类型：0-error；1-info;2-warning;3-question;-1-plain
     */
    public static void showInfoDialog(String message) {
        JOptionPane.showMessageDialog(null, message, "提示", JOptionPane.INFORMATION_MESSAGE);
    }


    /**
     * 创建文件选择器
     *
     * @param fileSelectionMode : 支持文件和目录，从获取 JFileChooser.DIRECTORIES_ONLY
     *                          0-文件；1-目录；2-文件和目录
     * @return
     */
    public static JFileChooser createFileChooser(boolean multiSelection, Integer fileSelectionMode) {
        JFileChooser chooser = new JFileChooser();   //设置选择器
        chooser.setMultiSelectionEnabled(multiSelection); //设为单选
        fileSelectionMode = fileSelectionMode == null ? JFileChooser.FILES_ONLY : fileSelectionMode;
        chooser.setFileSelectionMode(fileSelectionMode);//默认文件
        String title = fileSelectionMode == 0 ? "文件" : fileSelectionMode == 1 ? "目录" : "文件和目录";
        chooser.setDialogTitle("选择" + title);
        return chooser;
    }

    /**
     * 文件选择触发事件
     */
    public static void fileActionListener(JButton fromButton, JTextField fromText, String fileType) {
        //选择加密jar文件按钮监听事件
        fromButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {  //按钮点击事件
                //设置选择器
                JFileChooser chooser = createFileChooser(false, JFileChooser.FILES_ONLY);
                int returnVal = chooser.showOpenDialog(null);//是否打开文件选择框
                if (returnVal == JFileChooser.APPROVE_OPTION) { //如果符合文件类型，确定上传
                    if (StringUtils.isBlank(fileType)) {
                        SwingAwtUtils.showErrorDialog("文件格式错误，请选择指定上传文件类型！");
                        return;
                    }

                    String filepath = getAbsolutePath(chooser);//获取绝对路径
                    final String subffix = getFileSubffix(filepath);
                    if (fileType.indexOf(subffix) != -1) {
                        fromText.setText(filepath);
                    } else {
                        //提示信息
                        SwingAwtUtils.showErrorDialog("文件格式不正确，请重新选择文件！");
                    }
                }
            }
        });
    }

    /**
     * 目录选择触发事件
     */
    public static void dirActionListener(JButton toButton, JTextField toText) {
        toButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {  //按钮点击事件
                //设置选择器
                JFileChooser chooser = createFileChooser(false, JFileChooser.DIRECTORIES_ONLY);
                int returnVal = chooser.showOpenDialog(null);//是否打开文件选择框
                if (returnVal == JFileChooser.APPROVE_OPTION) {//如果符合文件类型
                    String filepath = getAbsolutePath(chooser);//获取绝对路径
                    toText.setText(filepath);
                }
            }
        });
    }


    /**
     * 选择清空按钮监听事件，清空所有输入框内容
     */
    public static void cleanActionListener(JButton cleanButton, JTextComponent[] texts) {
        //选择清空按钮监听事件，清空日志显示框
        cleanButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for (JTextComponent text : texts) {
                    text.setText("");
                }
            }
        });
    }


}
